package com.lazily.single_;



/**
 * @Author:  GZQ
 * @date:  2025/2/8 23:39
 * @description: 认识单例模式的实现方式 --> 饿汉式
 */

public class SingleTon02 {

	public static void main(String[] args) {
		// System.out.println(Cat.n1); // 不会打印 "构造器执行了..."
		Cat instance = Cat.getCat();
		System.out.println(instance);

		// 再次调用getCat
		Cat instance2 = Cat.getCat();
		System.out.println(instance2);

		System.out.println(instance == instance2);// true 说明是同一个对象

	}
}


// 希望在程序运行过程中，只能创建一个Cat对象
// 使用单例模式
class Cat {

	private String name;
	public static int n1 = 520;
	private static Cat cat;

	// 步骤
	// 1. 构造器私有化
	// 2. 定义一个static 静态属性对象
	// 3. 提供一个public 的static 方法, 可以返回一个Cat对象
	// 4. 懒汉式, 只有当用户使用getCat方法时, 才返回Cat对象, 后面再次调用时，会返回上次创建的Cat对象
	// 保证了单例
	private Cat(String name) {
		System.out.println("构造器执行了...");
		this.name = name;
	}

	public static Cat getCat() { // 代码存在线程安全问题, 如果多个线程同时调用getCat方法, 会创建多个Cat对象。
		if (cat == null) { // 如果为空就创建Cat对象
			cat = new Cat("小白");
		}
		return cat;
	}

	@Override
	public String toString() {
		return "Cat{" +
				"name='" + name + '\'' +
				'}';
	}
}


// 小结
/*
* 1. 单例模式的两种实现方式(1) 饿汉式(2) 懒汉式
* 2. 饿汉式的问题：在类加载的时候就创建, 可能存在资源浪费问题
* 3. 懒汉式的问题：线程安全问题, 之后完善。
* */
